package com.demo.java.OD501_550.OD501;

import java.util.Scanner;
import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【斗地主之顺子(B卷-100分)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146470362
 */
public class OdMain {
    public static void main(String[] args) {
        // 处理输入，获取牌的数组
        Scanner in = new Scanner(System.in);
        String line = in.nextLine();
        String[] cardsArr = line.split(" ");

        // 构建牌面与数字对应的映射
        Map<String, Integer> cards = new HashMap<>();
        cards.put("3", 3);
        cards.put("4", 4);
        cards.put("5", 5);
        cards.put("6", 6);
        cards.put("7", 7);
        cards.put("8", 8);
        cards.put("9", 9);
        cards.put("10", 10);
        cards.put("J", 11);
        cards.put("Q", 12);
        cards.put("K", 13);
        cards.put("A", 14);
        cards.put("2", 16);

        // 根据牌面大小进行排序
        Arrays.sort(cardsArr, (a, b) -> cards.get(a) - cards.get(b));

        List<String> stack = new ArrayList<>();
        List<String> res = new ArrayList<>();

        // 遍历每张牌
        for (String card : cardsArr) {
            // 处理牌堆，初始为空
            if (stack.size() == 0) {
                stack.add(card);
            } else {
                String top = stack.get(stack.size() - 1);
                // 如果当前牌与顶部的牌差值为1，说明它们是连续的
                if (cards.get(card) - cards.get(top) == 1) {
                    stack.add(card);
                }
                // 如果当前牌和顶部的牌相同，则继续处理
                else if (cards.get(card).equals(cards.get(top))) {
                    List<String> temp = new ArrayList<>(Arrays.asList(cardsArr));
                    temp.add(card);
                    cardsArr = temp.toArray(new String[0]);
                }
                // 如果不连续则处理当前连续的牌堆
                else {
                    List<String> temp = new ArrayList<>(Arrays.asList(cardsArr));
                    temp.add(0, card);
                    cardsArr = temp.toArray(new String[0]);

                    // 如果牌堆有5张以上的牌，保存结果
                    if (stack.size() >= 5) {
                        if (stack.size() < 10) {
                            res.add(String.join(" ", stack));
                        } else {
                            res.add(String.join(" ", stack.subList(0, 5)));
                            res.add(String.join(" ", stack.subList(5, stack.size())));
                        }
                    }
                    // 清空牌堆
                    stack.clear();
                }
            }
        }

        // 如果最后的牌堆有顺子，加入结果
        if (stack.size() >= 5) {
            res.add(String.join(" ", stack));
        }

        // 如果没有有效的顺子，输出"No"
        if (res.size() == 0) {
            System.out.println("No");
        } else {
            // 输出每个顺子
            for (String str : res) {
                System.out.println(str);
            }
        }
    }
}